package com.jijuxie.house.service;

import java.util.List;
import java.util.Map;
import java.time.LocalDateTime;
import java.math.BigDecimal;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jijuxie.house.domain.HouseInfo;
import com.jijuxie.house.domain.dto.HouseSearchDTO;
import com.jijuxie.house.domain.vo.HouseListVO;
import com.jijuxie.house.domain.vo.HouseMapVO;
import com.jijuxie.house.domain.dto.CollectCountDTO;

public interface IHouseService extends IService<HouseInfo> {

    /**
     * 分页查询房源列表
     */
    Page<HouseInfo> selectHousePage(Page<HouseInfo> page, HouseInfo houseInfo, 
            BigDecimal minPrice, BigDecimal maxPrice, 
            BigDecimal minArea, BigDecimal maxArea,
            String sortField, String sortOrder);

    /**
     * 查询房源详情
     */
    HouseInfo selectHouseById(Long houseId);

    /**
     * 新增房源
     */
    void insertHouse(HouseInfo houseInfo);

    /**
     * 修改房源
     */
    void updateHouse(HouseInfo houseInfo);

    /**
     * 删除房源
     */
    void deleteHouse(Long houseId);

    /**
     * 上架/下架房源
     */
    void changeStatus(Long houseId, String status);

    /**
     * 搜索房源
     */
    Page<HouseInfo> searchHousePage(Page<HouseInfo> page, HouseSearchDTO searchDTO);

    /**
     * 收藏房源
     */
    void collectHouse(Long houseId, Long userId);

    /**
     * 取消收藏
     */
    void cancelCollect(Long houseId, Long userId);

    /**
     * 查询收藏列表
     */
    Page<HouseInfo> selectCollectPage(Page<HouseInfo> page, Long userId);

    /**
     * 获取推荐房源
     */
    List<HouseInfo> selectRecommendList(Long userId);

    /**
     * 获取地图房源信息
     */
    HouseMapVO selectMapInfo(Long houseId);

    /**
     * 获取区域内房源
     */
    List<HouseMapVO> selectAreaHouses(Double minLng, Double maxLng, Double minLat, Double maxLat);

    /**
     * 查询附近房源
     * 
     * @param lng 经度
     * @param lat 纬度
     * @param radius 半径，单位：米
     * @param page 分页参数
     * @return 附近房源列表
     */
    Page<HouseMapVO> selectNearbyHouses(Double lng, Double lat, Double radius, Page<HouseMapVO> page);

    /**
     * 审核房源
     */
    void auditHouse(Long houseId, String status, Long auditorId);

    /**
     * 查询已删除的房源列表
     */
    Page<HouseInfo> selectDeletedHousePage(Page<HouseInfo> page, HouseInfo houseInfo);

    /**
     * 恢复已删除的房源
     */
    void restoreHouse(Long houseId);

    /**
     * 永久删除超过30天的已删除房源 由定时任务调用
     */
    void cleanDeletedHouses();

    /**
     * 获取热门房源列表
     *
     * @param page 分页参数
     * @return 热门房源列表
     */
    Page<HouseInfo> selectHotHousePage(Page<HouseInfo> page);

    /**
     * 获取最新房源列表
     *
     * @param page 分页参数
     * @return 最新房源列表
     */
    Page<HouseInfo> selectLatestHousePage(Page<HouseInfo> page);

    /**
     * 查询热门房源列表（包含详细信息）
     *
     * @param page 分页参数
     * @return 分页后的热门房源列表
     */
    Page<HouseListVO> selectHotHouseDetailPage(Page<HouseListVO> page);

    /**
     * 查询最新房源列表（包含详细信息）
     *
     * @param page 分页参数
     * @return 分页后的最新房源列表
     */
    Page<HouseListVO> selectLatestHouseDetailPage(Page<HouseListVO> page);

    /**
     * 检查房源是否已收藏
     */
    Boolean checkCollect(Long houseId, Long userId);

    /**
     * 获取用户收藏总数
     */
    Integer getUserCollectCount(Long userId);

    /**
     * 根据条件统计收藏数量
     */
    Integer countCollects(CollectCountDTO dto);

    /**
     * 按时间段统计收藏数量
     */
    List<Map<String, Object>> countCollectsInDateRange(Long userId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 按条件统计收藏数量
     *
     * @param countDTO 统计条件
     * @return 收藏数量
     */
    long countCollectsByCondition(CollectCountDTO countDTO);

    /**
     * 获取指定时间范围内的每日收藏数量
     *
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 每日收藏数量列表
     */
    List<Map<String, Object>> getDailyCollectCounts(Long userId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 批量更新所有房源的封面图片
     * 此方法将为所有没有封面图片的房源设置第一张图片作为封面图片
     */
    void updateAllHouseCoverImages();
}
